/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aqu.persistencia.utilidad.controlador;

import aqu.bean.generico.BeanGenerico;
import aqu.persistencia.Dao.CuentasPorPagar.CxpCabecerafacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpDetallefacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpProveedorManager;
import aqu.persistencia.entity.CxpCabeceraFactura;
import aqu.persistencia.entity.CxpDetalleFactura;
import aqu.persistencia.entity.CxpProveedor;
import aqu.persistencia.utilidad.Dao.CiudadManager;
import aqu.persistencia.utilidad.Dao.ProvinciaManager;
import aqu.persistencia.utilidad.Dao.TipoGastoManager;
import aqu.persistencia.utilidad.Dao.TipoIdentificacionManager;
import aqu.persistencia.utilidad.MessagesController;
import aqu.persistencia.utilidad.entity.Ciudad;
import aqu.persistencia.utilidad.entity.Dependientes;
import aqu.persistencia.utilidad.entity.DetalleGastos;
import aqu.persistencia.utilidad.entity.Provincia;
import aqu.persistencia.utilidad.entity.TipoGasto;
import aqu.persistencia.utilidad.entity.TipoIdentificacion;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import i18n.Constantes;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import jxl.demo.Write;
import org.dom4j.CDATA;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.InvalidXPathException;
import org.dom4j.Node;
import org.dom4j.Visitor;
import org.dom4j.XPath;

/**
 *
 * @author Verito Ramirez
 *         Victor Jaramillo
 */
@ManagedBean(name = "gastosPersonalesController")
@ViewScoped
public class GastosPersonalesController extends BeanGenerico {

    private Provincia provincia;
    private Ciudad ciudad;
    private TipoGasto tipoGasto;
    private TipoIdentificacion tipoIdentificacion;
    private DetalleGastos detalleGasto;
    private CxpProveedor proveedor;
    private CxpCabeceraFactura cabeceraFactura;
    private CxpDetalleFactura detalleFactura;            
    
    private List<Provincia> listaProvincias;
    private List<Ciudad> listaCiudades;
    private List<TipoGasto> listaTipoGastos;
    private List<TipoIdentificacion> listaTipoIdentificacion;
    private List<DetalleGastos> listaDetallesGastos;
    private List<CxpProveedor> listaProvedores;
    private List<CxpCabeceraFactura> listaCabceraFacturas;    
    private List<CxpDetalleFactura> listaDetalleFacturas;
    
    private ProvinciaManager provinciaManager = new ProvinciaManager();
    private CiudadManager ciudadManager = new CiudadManager();
    private TipoGastoManager tipoGastoManager = new TipoGastoManager();
    private TipoIdentificacionManager tipoIdentificacionManager = new TipoIdentificacionManager();
    private CxpProveedorManager cxpProveedorManager = new CxpProveedorManager();
    private CxpCabecerafacturaManager cxpCabecerafacturaManager = new CxpCabecerafacturaManager();
    private CxpDetallefacturaManager cxpDetallefacturaManager = new CxpDetallefacturaManager();

    private String identificacion, anio, nombres="", direccionCalle="", 
            direccionNumero="", direccionInterseccion="",
            AGPxml = "";
    private BigDecimal montoPensionAlimenticia, montoNoCubiertoAsegurados, totales;
    private Dependientes hijo, conyugue, discapacitado;
    private List<Dependientes> listaHijos, listaDiscapacitados;
    private boolean panelvisible;
    
    public GastosPersonalesController() {
        provincia = new Provincia();
        ciudad = new Ciudad();
        tipoGasto = new TipoGasto();
        tipoIdentificacion = new TipoIdentificacion();
        detalleGasto = new DetalleGastos();
        proveedor = new CxpProveedor();
        cabeceraFactura = new CxpCabeceraFactura();
        detalleFactura = new CxpDetalleFactura();
        
        listaProvincias = provinciaManager.getListOrdenado("nombrePro");
        listaCiudades = ciudadManager.getListOrdenado("nombreCiu");
        listaTipoGastos = tipoGastoManager.getList();
        listaTipoIdentificacion = tipoIdentificacionManager.getList();
        listaCabceraFacturas = cxpCabecerafacturaManager.getList();
        listaProvedores = cxpProveedorManager.getListOrdenado("cxpNombrePro");
        listaDetalleFacturas = cxpDetallefacturaManager.getList();
        
        identificacion = "";
        anio = "";
        montoPensionAlimenticia = BigDecimal.valueOf(0.0);
        montoNoCubiertoAsegurados = BigDecimal.valueOf(0.0);
        totales = BigDecimal.valueOf(0.0);
        hijo = new Dependientes();
        conyugue = new Dependientes();
        discapacitado = new Dependientes();
        listaHijos = new ArrayList<Dependientes>();
        listaDiscapacitados =new ArrayList<Dependientes>();
        listaDetallesGastos = new ArrayList<DetalleGastos>();
    }
    
    public boolean isPanelvisible() {
        return panelvisible;
    }

    public void setPanelvisible(boolean panelvisible) {
        this.panelvisible = panelvisible;
    }

    public void llamarPanelvisible(ActionEvent event) {
        panelvisible = !panelvisible;
    }

    public BigDecimal getTotales() {
        totales = BigDecimal.valueOf(0.0);
        if(listaDetallesGastos.isEmpty()){
            totales = montoNoCubiertoAsegurados.add(montoPensionAlimenticia);
        }else{
            for (DetalleGastos detalleGastosAux : listaDetallesGastos) {
               totales = totales.add(detalleGastosAux.getTotalBase());
               totales = totales.add(getMontoNoCubiertoAsegurados());
               totales = totales.add(getMontoPensionAlimenticia());
            }
        }        
        return totales;
    }

    public void setTotales(BigDecimal totales) {
        this.totales = totales;
    }

    public DetalleGastos getDetalleGasto() {
        return detalleGasto;
    }

    public void setDetalleGasto(DetalleGastos detalleGasto) {
        this.detalleGasto = detalleGasto;
    }

    public List<DetalleGastos> getListaDetallesGastos() {
        return listaDetallesGastos;
    }

    public void setListaDetallesGastos(List<DetalleGastos> listaDetallesGastos) {
        this.listaDetallesGastos = listaDetallesGastos;
    }

    public CxpCabeceraFactura getCabeceraFactura() {
        return cabeceraFactura;
    }

    public void setCabeceraFactura(CxpCabeceraFactura cabeceraFactura) {
        this.cabeceraFactura = cabeceraFactura;
    }

    public CxpCabecerafacturaManager getCxpCabecerafacturaManager() {
        return cxpCabecerafacturaManager;
    }

    public void setCxpCabecerafacturaManager(CxpCabecerafacturaManager cxpCabecerafacturaManager) {
        this.cxpCabecerafacturaManager = cxpCabecerafacturaManager;
    }

    public CxpDetallefacturaManager getCxpDetallefacturaManager() {
        return cxpDetallefacturaManager;
    }

    public void setCxpDetallefacturaManager(CxpDetallefacturaManager cxpDetallefacturaManager) {
        this.cxpDetallefacturaManager = cxpDetallefacturaManager;
    }

    public CxpProveedorManager getCxpProveedorManager() {
        return cxpProveedorManager;
    }

    public void setCxpProveedorManager(CxpProveedorManager cxpProveedorManager) {
        this.cxpProveedorManager = cxpProveedorManager;
    }

    public CxpDetalleFactura getDetalleFactura() {
        return detalleFactura;
    }

    public void setDetalleFactura(CxpDetalleFactura detalleFactura) {
        this.detalleFactura = detalleFactura;
    }

    public List<CxpCabeceraFactura> getListaCabceraFacturas() {
        return listaCabceraFacturas;
    }

    public void setListaCabceraFacturas(List<CxpCabeceraFactura> listaCabceraFacturas) {
        this.listaCabceraFacturas = listaCabceraFacturas;
    }

    public List<CxpDetalleFactura> getListaDetalleFacturas() {
        return listaDetalleFacturas;
    }

    public void setListaDetalleFacturas(List<CxpDetalleFactura> listaDetalleFacturas) {
        this.listaDetalleFacturas = listaDetalleFacturas;
    }

    public List<CxpProveedor> getListaProvedores() {
        return listaProvedores;
    }

    public void setListaProvedores(List<CxpProveedor> listaProvedores) {
        this.listaProvedores = listaProvedores;
    }

    public CxpProveedor getProveedor() {        
        return proveedor;
    }

    public void setProveedor(CxpProveedor proveedor) {
        this.proveedor = proveedor;
    }
    
    public String getDireccionCalle() {
        return direccionCalle;
    }

    public void setDireccionCalle(String direccionCalle) {
        this.direccionCalle = direccionCalle;
    }

    public String getDireccionInterseccion() {
        return direccionInterseccion;
    }

    public void setDireccionInterseccion(String direccionInterseccion) {
        this.direccionInterseccion = direccionInterseccion;
    }

    public String getDireccionNumero() {
        return direccionNumero;
    }

    public void setDireccionNumero(String direccionNumero) {
        this.direccionNumero = direccionNumero;
    }

    public String getNombres() {
        return nombres;
    }

    public void setNombres(String nombres) {
        this.nombres = nombres;
    }

    public String getAnio() {
        return anio;
    }

    public void setAnio(String anio) {
        this.anio = anio;
    }

    public Dependientes getConyugue() {
        return conyugue;
    }

    public void setConyugue(Dependientes conyugue) {
        this.conyugue = conyugue;
    } 

    public Dependientes getDiscapacitado() {
        return discapacitado;
    }

    public void setDiscapacitado(Dependientes discapacitado) {
        this.discapacitado = discapacitado;
    }

    public List<Dependientes> getListaDiscapacitados() {
        return listaDiscapacitados;
    }

    public void setListaDiscapacitados(List<Dependientes> listaDiscapacitados) {
        this.listaDiscapacitados = listaDiscapacitados;
    }

    public List<Dependientes> getListaHijos() {
        return listaHijos;
    }

    public void setListaHijos(List<Dependientes> listaHijos) {
        this.listaHijos = listaHijos;
    }
    
    public Dependientes getHijo() {
        return hijo;
    }

    public void setHijo(Dependientes hijo) {
        this.hijo = hijo;
    }

    public BigDecimal getMontoPensionAlimenticia() {
        return montoPensionAlimenticia;
    }

    public void setMontoPensionAlimenticia(BigDecimal montoPensionAlimenticia) {
        this.montoPensionAlimenticia = montoPensionAlimenticia;
    }

    public BigDecimal getMontoNoCubiertoAsegurados() {
        return montoNoCubiertoAsegurados;
    }

    public void setMontoNoCubiertoAsegurados(BigDecimal montoNoCubiertoAsegurados) {
        this.montoNoCubiertoAsegurados = montoNoCubiertoAsegurados;
    }

    public Ciudad getCiudad() {
        return ciudad;
    }

    public void setCiudad(Ciudad ciudad) {
        this.ciudad = ciudad;
    }

    public CiudadManager getCiudadManager() {
        return ciudadManager;
    }

    public void setCiudadManager(CiudadManager ciudadManager) {
        this.ciudadManager = ciudadManager;
    }

    public List<Ciudad> getListaCiudades() {
        String codProv = "";
        if(provincia.getCodigoPro() != null)
            codProv = provincia.getCodigoPro();
        if(codProv.equals(""))
            listaCiudades = ciudadManager.getListOrdenado("nombreCiu");
        else
            listaCiudades = ciudadManager.buscarPorProvincia(provincia);
        return listaCiudades;
    }

    public void setListaCiudades(List<Ciudad> listaCiudades) {
        this.listaCiudades = listaCiudades;
    }

    public List<Provincia> getListaProvincias() {
        return listaProvincias;
    }

    public void setListaProvincias(List<Provincia> listaProvincias) {
        this.listaProvincias = listaProvincias;
    }

    public List<TipoGasto> getListaTipoGastos() {
        return listaTipoGastos;
    }

    public void setListaTipoGastos(List<TipoGasto> listaTipoGastos) {
        this.listaTipoGastos = listaTipoGastos;
    }

    public List<TipoIdentificacion> getListaTipoIdentificacion() {
        return listaTipoIdentificacion;
    }

    public void setListaTipoIdentificacion(List<TipoIdentificacion> listaTipoIdentificacion) {
        this.listaTipoIdentificacion = listaTipoIdentificacion;
    }

    public Provincia getProvincia() {
        return provincia;
    }

    public void setProvincia(Provincia provincia) {
        this.provincia = provincia;
    }

    public ProvinciaManager getProvinciaManager() {
        return provinciaManager;
    }

    public void setProvinciaManager(ProvinciaManager provinciaManager) {
        this.provinciaManager = provinciaManager;
    }

    public TipoGasto getTipoGasto() {
        return tipoGasto;
    }

    public void setTipoGasto(TipoGasto tipoGasto) {
        this.tipoGasto = tipoGasto;
    }

    public TipoGastoManager getTipoGastoManager() {
        return tipoGastoManager;
    }

    public void setTipoGastoManager(TipoGastoManager tipoGastoManager) {
        this.tipoGastoManager = tipoGastoManager;
    }

    public TipoIdentificacion getTipoIdentificacion() {
        return tipoIdentificacion;
    }

    public void setTipoIdentificacion(TipoIdentificacion tipoIdentificacion) {
        this.tipoIdentificacion = tipoIdentificacion;
    }

    public TipoIdentificacionManager getTipoIdentificacionManager() {
        return tipoIdentificacionManager;
    }

    public void setTipoIdentificacionManager(TipoIdentificacionManager tipoIdentificacionManager) {
        this.tipoIdentificacionManager = tipoIdentificacionManager;
    }

    public String getIdentificacion() {
        return identificacion;
    }

    public void setIdentificacion(String identificacion) {
        this.identificacion = identificacion;
    }
    
    public void rowSelectorListener(RowSelectorEvent event){
        hijo = listaHijos.get(event.getRow());        
    }
    
    public void rowSelectorListenerDisc(RowSelectorEvent event){
        discapacitado = listaDiscapacitados.get(event.getRow());
    }
    
    public void rowSelectorListenerGastos(RowSelectorEvent event){
        detalleGasto = listaDetallesGastos.get(event.getRow());
        switchTipoGasto(detalleGasto);
        switchProveedor(detalleGasto);
    }
    
    public void switchProveedor(DetalleGastos detalleGasto){
        proveedor = detalleGasto.getProveedor();
    }
    
    public void switchTipoGasto(DetalleGastos detalleGasto){
        tipoGasto = detalleGasto.getTipoGasto();
    }
    public void insertarHijo(ActionEvent actionEvent){
        try{
            listaHijos.add(hijo);
            hijo = new Dependientes();
        }catch(Exception ex){
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }            
    }
    
    public void eliminarHijo(){
        try{
            listaHijos.remove(hijo);
            hijo = new Dependientes();
        }catch(Exception ex){
            MessagesController.addInfo("Error al eliminar; " + ex.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void insertarDiscapacitado(ActionEvent actionEvent){
        try{
            listaDiscapacitados.add(discapacitado);
            discapacitado = new Dependientes();
        }catch(Exception ex){
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }            
    }
    
    public void eliminarDiscapacitado(){
        try{
            listaDiscapacitados.remove(discapacitado);
            discapacitado = new Dependientes();
        }catch(Exception ex){
            MessagesController.addInfo("Error al eliminar; " + ex.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void insertarGasto(ActionEvent actionEvent){
        try{
            CxpProveedor proveedorAux = new CxpProveedor();
            List<CxpProveedor> listaProveedorAux = cxpProveedorManager.buscarPorProveedor(proveedor);            
            proveedorAux = listaProveedorAux.get(0);
            if(listaDetallesGastos.isEmpty()){
                detalleGasto.setProveedor(proveedorAux);
                detalleGasto.setTipoGasto(tipoGasto);                
                int numComprobantes = devolverNumComporbantes(proveedor);
                if(numComprobantes != 0){
                    detalleGasto.setNumComprobantes(numComprobantes);
                    detalleGasto.setTotalBase(calcularTotal(proveedor));
                }else {
                    detalleGasto.setNumComprobantes(numComprobantes);
                    detalleGasto.setTotalBase(BigDecimal.valueOf(0.0));
                }
                listaDetallesGastos.add(detalleGasto);
                detalleGasto = new DetalleGastos();
                proveedor = new CxpProveedor();
                tipoGasto = new TipoGasto();
            }else{
                for(int i = 0; i < listaDetallesGastos.size() ; i++){
                    String provedorLista, provedorAux;
                    provedorLista = listaDetallesGastos.get(i).getProveedor().getCxpRucPro();
                    provedorAux = proveedor.getCxpRucPro();
                    if(provedorLista.equals(provedorAux))
                        throw new Exception("Error el proveedor ya esta en la lista porfavor elija otro");
                }
                detalleGasto.setProveedor(proveedorAux);
                detalleGasto.setTipoGasto(tipoGasto);
                int numComprobantes = devolverNumComporbantes(proveedor);
                if(numComprobantes != 0){
                    detalleGasto.setNumComprobantes(numComprobantes);
                    detalleGasto.setTotalBase(calcularTotal(proveedor));
                }else {
                    detalleGasto.setNumComprobantes(numComprobantes);
                    detalleGasto.setTotalBase(BigDecimal.valueOf(0.0));
                }
                listaDetallesGastos.add(detalleGasto);
                detalleGasto = new DetalleGastos();
                proveedor = new CxpProveedor();
                tipoGasto = new TipoGasto();
            }            
        }catch(Exception ex){
            MessagesController.addInfo("Error al insertar Gasto: "+ ex.getMessage());
            llamarPanelvisible(null);
        }
    }   
    
    public void eliminarGasto(){
        try{
            detalleGasto.setProveedor(proveedor);
            detalleGasto.setTipoGasto(tipoGasto);
            listaDetallesGastos.remove(detalleGasto);
            detalleGasto = new DetalleGastos();
        }catch(Exception ex){
            MessagesController.addInfo("Error al eliminar; " + ex.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void sumar(ActionEvent actionEvent){
        setMontoNoCubiertoAsegurados(montoNoCubiertoAsegurados);
        setMontoPensionAlimenticia(montoPensionAlimenticia);
    }
    public int devolverNumComporbantes(CxpProveedor proveedor1) throws Exception{
        listaCabceraFacturas = cxpCabecerafacturaManager.buscarPorProveedor(proveedor1);
        if(listaCabceraFacturas.isEmpty())
            return 0;
        else{
            return listaCabceraFacturas.size();
        }
    }
    
    public BigDecimal calcularTotal(CxpProveedor proveedor1){
        Double totalAux = 0.0;
        listaCabceraFacturas = cxpCabecerafacturaManager.buscarPorProveedor(proveedor1);
        if(listaCabceraFacturas.isEmpty())
            return BigDecimal.valueOf(0.0);
        else{
            for (int i = 0; i < listaCabceraFacturas.size(); i++) {
                cabeceraFactura = listaCabceraFacturas.get(i);
                listaDetalleFacturas = cxpDetallefacturaManager.buscarporcabecera(cabeceraFactura);
                if(!listaDetalleFacturas.isEmpty()){
                    for(int j = 0 ; j < listaDetalleFacturas.size() ; j++){
                        detalleFactura  =listaDetalleFacturas.get(j);
                        totalAux += detalleFactura.getCxpCantidadDetfac();
                    }
                }                    
            }
            return BigDecimal.valueOf(totalAux);
        }
    }
    
    public void generarArchivoAGP(ActionEvent event){
        try{
            File archivoAGP = new File("C:\\SRI-DIMM\\AGP\\AGP_" + identificacion + "_"+anio+".xml");
            FileWriter writer = new FileWriter(archivoAGP);
            writer.write(Constantes.PRIMERA_LINEA);
            writer.write("\n<gastosPersonales>");
            writer.write("\n\t<tipoIdentificacion>"+tipoIdentificacion.getCodigoTipIde()+"</tipoIdentificacion>");
            if(tipoIdentificacion.getCodigoTipIde().equals("C")){
                if(identificacion.length()!=10)
                    throw new Exception("Su cedula es incorrecta.");
            }else if(tipoIdentificacion.getCodigoTipIde().equals("R")){
                if(identificacion.length()!=13 || !identificacion.substring(10).equals("001"))
                    throw new Exception("Su numero de RUC es incorrecta.");
            }else if(tipoIdentificacion.getCodigoTipIde().equals("P")){
                if(identificacion.length()< 1 || identificacion.length()>13)
                    throw new Exception("Pasaporte incorrecto es incorrecta.");
            }
            writer.write("\n\t<identificacion>" +identificacion +"</identificacion>\n");
            writer.write("\n\t<nombresApellidos>"+nombres+"</nombresApellidos>\n");
            writer.write("\n\t<dirCalle>"+ direccionCalle +"</dirCalle>");
            writer.write("\n\t<dirNumero>"+direccionNumero+ "</dirNumero>");
            writer.write("\n\t<dirInterseccion>"+direccionInterseccion+"</dirInterseccion>");
            writer.write("\n\t<dirProvincia>"+provincia.getCodigoPro()+"</dirProvincia>");
            writer.write("\n\t<dirCanton>"+ciudad.getCodigoCiu()+"</dirCanton>");
            writer.write("\n\t<telefono>023035990</telefono>");
            writer.write("\n\t<periodoFiscal>"+anio+"</periodoFiscal>");
            if(conyugue.getTipoIdentificacion().equals("C")){
                if(conyugue.getIdentificacion().length()!=10)
                    throw new Exception("Cedula de Conyugue incorrecta.");
            }else if(conyugue.getTipoIdentificacion().equals("R")){
                throw new Exception("Conyugue no puede tener RUC");
            }else if(conyugue.getTipoIdentificacion().equals("P")){
                if(conyugue.getIdentificacion().length()< 1 || conyugue.getIdentificacion().length()>13)
                    throw new Exception("Pasaporte de Conyugue, incorrecta.");
            }
            writer.write("\n\t<conyugueDependiente>"
                            + "\n\t\t<detalleConyugueDependiente>"
                                + "\n\t\t\t<tipoIdentificacion>"+conyugue.getTipoIdentificacion()+"</tipoIdentificacion>"
                                + "\n\t\t\t<nombres>"+conyugue.getNombreCompleto()+"</nombres>"
                                + "\n\t\t\t<identificacion>"+conyugue.getIdentificacion()+"</identificacion>"
                            + "\n\t\t</detalleConyugueDependiente>"
                        +"\n\t</conyugueDependiente>");            
            if(!listaHijos.isEmpty()){
                writer.write("\n\t<hijosDependientes>");//hijos
                for (Dependientes hijoAux : listaHijos) {
                    if(hijoAux.getTipoIdentificacion().equals("C")){
                        if(hijoAux.getIdentificacion().length()!=10)
                            throw new Exception("Cedula de Hijo "+hijoAux.getNombreCompleto()+" incorrecta.");
                    }else if(hijoAux.getTipoIdentificacion().equals("R")){
                        throw new Exception("Hijo "+hijoAux.getNombreCompleto()+" no puede tener RUC");
                    }else if(hijoAux.getTipoIdentificacion().equals("P")){
                        if(hijoAux.getIdentificacion().length()< 1 || hijoAux.getIdentificacion().length()>13)
                            throw new Exception("Pasaporte de Hijo: "+hijoAux.getNombreCompleto()+" es incorrecta.");
                    }
                    writer.write("\n\t\t<detallesHijosDependientes>"
                                    + "\n\t\t\t<tipoIdentificacion>"+hijoAux.getTipoIdentificacion()+"</tipoIdentificacion>"
                                    + "\n\t\t\t<nombres>"+hijoAux.getNombreCompleto()+"</nombres>"
                                    + "\n\t\t\t<identificacion>"+hijoAux.getIdentificacion()+"</identificacion>"
                                +"\n\t\t</detallesHijosDependientes>");
                } 
                writer.write("\n\t</hijosDependientes>");
            }           
            if(!listaDiscapacitados.isEmpty()){
                writer.write("\n\t<discapacitadosDependientes>");//discapacitados
                for(Dependientes discapacitadoAux : listaDiscapacitados){
                    if(discapacitadoAux.getTipoIdentificacion().equals("C")){
                        if(discapacitadoAux.getIdentificacion().length()!=10)
                            throw new Exception("Cedula de Pers Dependiente "+discapacitadoAux.getNombreCompleto()+" incorrecta.");
                    }else if(discapacitadoAux.getTipoIdentificacion().equals("R")){
                        throw new Exception("Pers Dependiente "+discapacitadoAux.getNombreCompleto()+" no puede tener RUC");
                    }else if(discapacitadoAux.getTipoIdentificacion().equals("P")){
                        if(discapacitadoAux.getIdentificacion().length()< 1 || discapacitadoAux.getIdentificacion().length()>13)
                            throw new Exception("Pasaporte de Pers Dependiente: "+discapacitadoAux.getNombreCompleto()+" es incorrecta.");
                    }
                    writer.write("\n\t\t<detalleDiscapacitadosDependientes>"
                                    + "\n\t\t\t<tipoIdentificacion>"+discapacitadoAux.getTipoIdentificacion()+"</tipoIdentificacion>"
                                    + "\n\t\t\t<nombres>"+discapacitadoAux.getNombreCompleto()+"</nombres>"
                                    + "\n\t\t\t<identificacion>"+discapacitadoAux.getIdentificacion()+"</identificacion>"
                                +"\n\t\t</detalleDiscapacitadosDependientes>");
                }
                writer.write("\n\t</discapacitadosDependientes>");
            }            
            
            if(!listaDetallesGastos.isEmpty()){
                writer.write("\n\t<gastos>");
                for(DetalleGastos detalleGastoAux : listaDetallesGastos){
                    writer.write("\n\t\t<detalleGasto>"
                                    + "\n\t\t\t<rucProveedor>"+detalleGastoAux.getProveedor().getCxpRucPro()+"</rucProveedor>"
                                    + "\n\t\t\t<totalComprobantesVenta>"+detalleGastoAux.getNumComprobantes()+"</totalComprobantesVenta>"
                                    + "\n\t\t\t<totalBaseImponible>"+detalleGastoAux.getTotalBase()+"</totalBaseImponible>"
                                    + "\n\t\t\t<tipoGasto>"+detalleGastoAux.getTipoGasto().getCodigoTipGas()+"</tipoGasto>"
                                + "\n\t\t</detalleGasto>");
                }
                writer.write("\n\t</gastos>");
            }
            writer.write("\n\t<rubrosNoIdentificanProveedor>"
                            + "\n\t\t<detalleRubrosNoIdentificanProveedor>"
                                + "\n\t\t\t<totalPencionesAlimenticias>6000.00</totalPencionesAlimenticias>"
                                + "\n\t\t\t<totalValoresAseguradoras>2000.00</totalValoresAseguradoras>"
                            + "\n\t\t</detalleRubrosNoIdentificanProveedor>"
                        + "\n\t</rubrosNoIdentificanProveedor>");
            writer.write("\n</gastosPersonales>");    
            writer.close();
            
            provincia = new Provincia();
            ciudad = new Ciudad();
            tipoGasto = new TipoGasto();
            tipoIdentificacion = new TipoIdentificacion();
            detalleGasto = new DetalleGastos();
            proveedor = new CxpProveedor();
            cabeceraFactura = new CxpCabeceraFactura();
            detalleFactura = new CxpDetalleFactura();

            listaProvincias = provinciaManager.getListOrdenado("nombrePro");
            listaCiudades = ciudadManager.getListOrdenado("nombreCiu");
            listaTipoGastos = tipoGastoManager.getList();
            listaTipoIdentificacion = tipoIdentificacionManager.getList();
            listaCabceraFacturas = cxpCabecerafacturaManager.getList();
            listaProvedores = cxpProveedorManager.getListOrdenado("cxpNombrePro");
            listaDetalleFacturas = cxpDetallefacturaManager.getList();

            identificacion = "";
            anio = "";
            montoPensionAlimenticia = BigDecimal.valueOf(0.0);
            montoNoCubiertoAsegurados = BigDecimal.valueOf(0.0);
            totales = BigDecimal.valueOf(0.0);
            hijo = new Dependientes();
            conyugue = new Dependientes();
            discapacitado = new Dependientes();
            listaHijos = new ArrayList<Dependientes>();
            listaDiscapacitados =new ArrayList<Dependientes>();
            listaDetallesGastos = new ArrayList<DetalleGastos>();
        
        
        }catch(Exception ex){
            MessagesController.addError("Error al Generar archivo XML; " + ex.getMessage());
            llamarPanelvisible(null);
        }         
    }
    
}